// m

// 给定一个m*n的二维矩阵，matrix，按照顺时针旋转的顺序，返回矩阵中的所有元素

// 思路,模拟
// 使用数组ans存储答案，，然后定义上下左右的边界
// 然后按照顺时针的顺序从边界依次访问元素
// 当访问完当前边界后，要更新一下边界位置，缩小范围，方便下一轮进行访问
// 最后返回答案数组ans

// 复杂度分析
// 时间复杂度：O(m * n),m,n分别为二维矩阵的行数和列数
// 空间复杂度：O(m * n)，如果算答案数组的，否则是O(1)

function spiralOrder(matrix) {
    let up = 0
    let down = matrix.length - 1
    let left = 0
    let right = matrix[0].length - 1
    let ans = []

    while (true) {
        for (let i = left; i <= right; i++) {
            ans.push(matrix[up][i])            
        }
        up += 1
        if (up > down) {
            break
        }
        for (let i = up; i <= down; i++) {
            ans.push(matrix[i][right])            
        }
        right -= 1
        if (right < left) {
            break
        }
        for (let i = right; i >= left; i--) {
            ans.push(matrix[down][i])            
        }
        down -= 1
        if (down < up) {
            break
        }
        for (let i = down; i >= up; i--) {
            ans.push(matrix[i][left])            
        }
        left += 1
        if (left > right) {
            break
        }
    }
    return ans
}

let matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
console.log(spiralOrder(matrix));